package Harmonisation;

import java.io.File;
import java.io.FileWriter;
import java.util.ArrayList;

import Exception.ExtensionFichierException;
import Exception.NombreArgumentInvalideException;
import Exception.OptionException;

public class LecteurOption {
	private String option[];

	public LecteurOption(String option[]) {
		this.option = option;
	}

	public void analyserOption() throws OptionException, NombreArgumentInvalideException, ExtensionFichierException {
		if (this.option.length == 0) {
			throw new OptionException("Erreur options, 0 arguments");
		} else if (option[0].equals("-name")) {
			optionName();
		} else if (option[0].equals("-h")) {
			optionH();
		} else if (option[0].equals("-midi")) {
			optionMidi();
		} else if (option[0].equals("-ly")) {
			optionLy();
		} else if (option[0].equals("-nombre")) {
			optionNombre();
		} else if (option[0].equals("-beaute")) {
			optionBeaute();
		} else if (option[0].equals("-w")) {
			optionW();
		} else {
			throw new OptionException("Aucune option n'est reconnu, essayez l'option -h");
		}

	}

	public void optionW() throws NombreArgumentInvalideException {
		verifOptionW();
		File dossier = new File(option[1]);
		if (dossier.exists() && dossier.isDirectory()) {
			String s = "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\"\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\"><html lang=\"fr\" xml:lang=\"fr\" xmlns=\"http://www.w3.org/1999/xhtml\"><head><meta http-equiv=\"content-type\" content=\"text/html; charset=utf-8\" /><title>Harmonisation Automatique</title><link rel=\"stylesheet\" type=\"text/css\" href=\"css/style.css\" /></head><body>";
			File[] listeFichier = dossier.listFiles();
			s += "<table border=\"1\" style=\"empty-cells : hide;\"><thead><tr><td>Nom du chant</td><td>Nombre d'harmonisations</td><td>Liens</td></tr></thead>";
			s += "<tbody>";
			for (File f : listeFichier) {
				if (f.getName().charAt(0) != '.') {
					s += "<tr>";
					ArrayList<Note> listeSopra = new ArrayList<Note>();
					listeSopra = ImportChant.lecture(option[1] + "/" + f.getName());
					Harmonisation hm = new Harmonisation(listeSopra);
					long nbHarmo = hm.nombreHarmonisations();
					String nom = f.getName().substring(0, f.getName().indexOf("."));
					s += "<td>" + nom + "</td><td>" + nbHarmo + "</td>";
					Chant c = hm.generationChantAleatoire();
					File sousDossier = new File(option[2] + "/" + nom + "/Aleatoire");
					System.out.println(option[2] + "/" + nom + "/Aleatoire");
					sousDossier.mkdirs();
					c.sortieLilypond(option[2] + "/" + nom + "/Aleatoire/" + nom + ".ly");
					c.sortieMidi(option[2] + "/" + nom + "/Aleatoire/" + nom + ".mid");
					s += "<td> Aleatoire : <a href=\"" + nom + "/Aleatoire/" + nom + ".ly" + "\">" + nom + ".ly</a>&nbsp<a href=\"" + nom + "/Aleatoire/" + nom + ".mid" + "\">" + nom + ".mid</a></br>";
					for (int i = 1; i <= 4; i++) {
						c = hm.genererChantBeaute(i);
						sousDossier = new File(option[2] + "/" + nom + "/Beaute" + i);
						sousDossier.mkdirs();
						c.sortieLilypond(option[2] + "/" + nom + "/Beaute" + i + "/" + nom + ".ly");
						c.sortieMidi(option[2] + "/" + nom + "/Beaute" + i + "/" + nom + ".mid");
						s += "Beaute " + i + " : <a href=\"" + nom + "/Beaute" + i + "/" + nom + ".ly" + "\">" + nom + ".ly</a>&nbsp<a href=\"" + nom + "/Beaute" + i + "/" + nom + ".mid" + "\">" + nom + ".mid</a></br>";

					}
					s += "</td>";
					s += "</tr>";
				}
			}
			s += "</tbody></table></body></html>";
			try {
				FileWriter w;
				w = new FileWriter(option[2] + "/Tableau.html");
				w.write(s);
				w.close();
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}

	public void verifOptionW() throws NombreArgumentInvalideException {
		if (this.option.length < 3) {
			throw new NombreArgumentInvalideException();
		}
	}

	public void optionBeaute() throws NombreArgumentInvalideException, ExtensionFichierException, OptionException {
		verifOptionBeaute();
		if (option[2].equals("ly")) {
			ArrayList<Note> listeSopra = new ArrayList<Note>();
			listeSopra = ImportChant.lecture(option[3]);
			Harmonisation hm = new Harmonisation(listeSopra);
			Chant c = hm.genererChantBeaute(Integer.parseInt(option[1]));
			c.sortieLilypond(option[4]);
		} else if (option[2].equals("midi")) {
			ArrayList<Note> listeSopra = new ArrayList<Note>();
			listeSopra = ImportChant.lecture(option[3]);
			Harmonisation hm = new Harmonisation(listeSopra);
			Chant c = hm.genererChantBeaute(Integer.parseInt(option[1]));
			c.sortieMidi(option[4]);
			LectureMidi.lecture(option[4]);
		}
	}

	public void verifOptionBeaute() throws NombreArgumentInvalideException, ExtensionFichierException, OptionException {
		if (this.option.length < 5) {
			throw new NombreArgumentInvalideException();
		}
		if (!((verificationExtension(option[3], "chant") && verificationExtension(option[4], "mid")))) {
			throw new ExtensionFichierException("L\'extension des fichiers doivent etre du type .chant .mid");
		}
		if (!(option[2].equals("ly") || option[2].equals("midi"))) {
			throw new OptionException(option[2] + " : n'est pas une option valide. L'option peut etre -ly ou -midi");
		}
	}

	public void optionNombre() throws NombreArgumentInvalideException, ExtensionFichierException {
		verifOptionNombre();
		ArrayList<Note> listeSopra = new ArrayList<Note>();
		listeSopra = ImportChant.lecture(option[1]);
		Harmonisation hm = new Harmonisation(listeSopra);
		long nbHarmo = hm.nombreHarmonisations();
		System.out.println(nbHarmo);

	}

	public void verifOptionNombre() throws NombreArgumentInvalideException, ExtensionFichierException {
		if (this.option.length < 2) {
			throw new NombreArgumentInvalideException();
		}

		if (!verificationExtension(option[1], "chant")) {
			throw new ExtensionFichierException("L'extension du fichier doit etre du type .chant");
		}
	}

	public void optionLy() throws NombreArgumentInvalideException, ExtensionFichierException {
		verifOptionLy();
		try {
			ArrayList<Note> listeSopra = new ArrayList<Note>();
			listeSopra = ImportChant.lecture(option[1]);
			Harmonisation hm = new Harmonisation(listeSopra);
			Chant c = hm.generationChantAleatoire();
			c.sortieLilypond(option[2]);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public void verifOptionLy() throws NombreArgumentInvalideException, ExtensionFichierException {
		if (this.option.length < 3) {
			throw new NombreArgumentInvalideException();
		}
		if (!verificationExtension(option[1], "chant")) {
			throw new ExtensionFichierException("L'extension du fichier doit etre du type .chant");
		}
		if (!verificationExtension(option[2], "ly")) {
			throw new ExtensionFichierException("L'extension du fichier doit etre du type .ly");
		}
	}

	public void optionMidi() throws NombreArgumentInvalideException, ExtensionFichierException {
		verifOptionMidi();
		try {
			ArrayList<Note> listeSopra = new ArrayList<Note>();
			listeSopra = ImportChant.lecture(option[1]);
			Harmonisation hm = new Harmonisation(listeSopra);
			Chant c = hm.generationChantAleatoire();
			c.sortieMidi(option[2]);
			LectureMidi.lecture(option[2]);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public void verifOptionMidi() throws NombreArgumentInvalideException, ExtensionFichierException {
		if (this.option.length < 3) {
			throw new NombreArgumentInvalideException();
		}

		if (!verificationExtension(option[1], "chant")) {
			throw new ExtensionFichierException("L'extension du fichier doit etre du type .chant");
		}
		if (!verificationExtension(option[2], "mid")) {
			throw new ExtensionFichierException("L'extension du fichier doit etre du type .mid");
		}
	}

	public void optionLecture() throws NombreArgumentInvalideException {
		verifOptionLecture();
		LectureMidi.lecture(option[2]);
	}

	public void verifOptionLecture() throws NombreArgumentInvalideException {
		if (this.option.length < 3) {
			throw new NombreArgumentInvalideException();
		}
	}

	public void optionH() {
		System.out.println("1. java -jar Harmonie.jar -name affiche vos noms et prénoms");
		System.out.println("2. java -jar Harmonie.jar -h rappelle la liste des options du programme");
		System.out.println("3. java -jar Harmonie.jar -midi fichier1.chant fichier2.mid donne une harmonisation du chant contenu dans fichier1.chant sous la forme d�un fichier midi fichier2.mid.");
		System.out.println("4. java -jar Harmonie.jar -ly fichier1.chant fichier2.ly donne une harmonisation du chant contenu dans fichier1.chant sous la forme d�un fichier LiLyPond fichier2.ly.");
		System.out.println("5. java -jar Harmonie.jar -nombre fichier1.chant écrit le nombre d'harmonisations du chant contenu dans fichier1.chant.");
		System.out.println("6. java -jar Harmonie.jar -beaute k -midi fichier1.chant fichier2.mid donne une plus belle harmonisation du chant contenu dans fichier1.chant suivant le critère de beauté numéro k (k=1..4) sous la forme d'un fichier midi fichier2.mid.");
		System.out.println("7. java -jar Harmonie.jar -beaute k -ly fichier1.chant fichier2.mid donne une plus belle harmonisation du chant contenu dans fichier1.chant suivant le critère de beauté numéro k (k=1..4) sous la forme d'un fichier LiLyPond fichier2.ly.");
		System.out.println("8. java -jar Harmonie.jar -w dossier1 dossier2 donne le résultat des calculs demandés précédents (3 à 7) appliqués à tous les fichiers de chant du dossier dossier1 sous la forme d'un dossier dossier2 contenant les fichiers midi et LiLyPond calculés et une page html produisant un tableau qui, pour chaque chant, donne le nom, le nombre d'harmonisations et les liens sur les fichiers calculés.");
		System.out.println("9. java -jar Harmonie.jar -l fichier.mid lit le fichier entré en paramètre.");
	}

	public void optionName() {
		System.out.println("Groupe : ");
		System.out.println("-Clément Dechaene");
		System.out.println("-Loïc Brill");
		System.out.println("-Julien Gauttier");
		System.out.println("-Vladimir Karassouloff");
	}

	public boolean verificationExtension(String fichier, String extension)// verifie qu'un fichier est bien un fichier du type de l'extension
	{
		boolean pointTrouve = false, valide = false;
		int i = 0, k = 0;

		while (i < fichier.length()) {
			if (fichier.charAt(i) == '.') {
				k = i;
				pointTrouve = true;
			}
			i++;
		}

		if (pointTrouve) {
			if (k != fichier.length() - 1) {
				if (fichier.substring(k + 1).equals(extension)) {
					valide = true;
				}
			}
		}

		return valide;
	}

}
